home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / SCIENTIF / 0807.ZIP / SIDEREAL.BAS < prev    next >
BASIC Source File  |  1987-09-30  |  13KB  |  451 lines

  1. ' Program "SIDEREAL"
  2.  
  3. ' Copyright (C) 1986 by David Eagle
  4.  
  5. ' Determines the relationships between times and dates
  6.  
  7. ' public domain for IBM-PC on March 30, 1986
  8.  
  9. ' IBM-PC  << QuickBASIC Compiler Version 3.0 >>
  10.  
  11. '********************************************************************
  12.  
  13. DEFDBL A-Z
  14. OPTION BASE 1
  15.  
  16. DIM SHARED MONTH$(12)
  17.  
  18. COMMON SHARED OBSLONG$,LCT$,CDATE$,LST$,CHOICE%
  19. COMMON SHARED OBSLONG.RAD,ZONE%,DST%
  20. COMMON SHARED MONTH%,DAY%,YEAR%,JD0,JDATE
  21. COMMON SHARED LCT.HR,LCT.MIN,LCT.SEC,LST.HR,LST.MIN,LST.SEC
  22.  
  23. CONST PI=3.141592653589793D0
  24. CONST PI2=2D0*PI
  25. CONST DTR=PI/180D0
  26. CONST WE=.262516145D0
  27. CONST XE=PI/12D0
  28. CONST XER=12D0/PI
  29.  
  30. MONTH$(1)="January"
  31. MONTH$(2)="February"
  32. MONTH$(3)="March"
  33. MONTH$(4)="April"
  34. MONTH$(5)="May"
  35. MONTH$(6)="June"
  36. MONTH$(7)="July"
  37. MONTH$(8)="August"
  38. MONTH$(9)="September"
  39. MONTH$(10)="October"
  40. MONTH$(11)="November"
  41. MONTH$(12)="December"
  42.  
  43. DEF FNJDATE0(MONTH%,DAY%,YEAR%)
  44.     'Julian Date function
  45.     F=367D0*YEAR%-INT(7*((YEAR%+INT((MONTH%+9)/12))/4))
  46.     F=F+INT(275*MONTH%/9)+DAY%+1721028.5D0
  47.     FNJDATE0=F-INT(3*(INT((YEAR%+SGN(MONTH%-9)*INT(ABS((MONTH%-9)/7)))/100)+1)/4)
  48. END DEF
  49.  
  50. DEF FNGMT(H,M,S,ZONE%,DST%)=H+M/60D0+S/3600D0+ZONE%-DST%
  51. DEF FNDEMOD(X)=X-PI2*INT(X/PI2)
  52.  
  53. '********************************************************************
  54.  
  55. ' initialization
  56.  
  57. CLS
  58. PRINT
  59. PRINT "Program SIDEREAL"
  60. PRINT "(C) Copyright 1986 by David Eagle"
  61. PRINT
  62. PRINT "Microsoft QuickBASIC Compiler"
  63. PRINT "(C) Copyright Microsoft Corp. 1982-1987"
  64. PRINT
  65. CALL KEYCHECK
  66.  
  67. CLS
  68. PRINT
  69. PRINT
  70. PRINT "Program introduction ( y = yes, n = no )"
  71. INPUT INTRO$
  72. IF INSTR("yY",INTRO$) THEN CALL INTRODUCTION
  73.  
  74. DO
  75.    CALL SELECTION.MENU
  76.  
  77.    SELECT CASE CHOICE%
  78.    CASE 1
  79.         CALL JDATE.FROM.GDATE
  80.    CASE 2
  81.         CALL GDATE.FROM.JDATE
  82.    CASE 3
  83.         CALL LST.FROM.LCT
  84.    CASE 4
  85.         CALL LCT.FROM.LST
  86.    END SELECT
  87.  
  88.    CALL DISPLAY.DATA
  89.  
  90.    CLS
  91.    PRINT
  92.    PRINT
  93.    PRINT "Another selection ( y = yes, n = no )"
  94.    INPUT SELECTION$
  95. LOOP UNTIL INSTR("nN",SELECTION$)
  96.  
  97. END
  98.  
  99. '********************************************************************
  100.  
  101. SUB LCT.FROM.LST STATIC
  102.  
  103.     ' local civil time from local sidereal time subroutine
  104.  
  105.     CLS
  106.     PRINT
  107.     PRINT
  108.     PRINT "Calendar date ( month [ 1 - 12 ], day [ 1 - 31 ], year [ YYYY ] )"
  109.     PRINT "( NOTE: B.C. dates are negative, A.D. dates are positive )"
  110.     PRINT "( For example, October 21, 1948 is input as 10,21,1948 )"
  111.     INPUT MONTH%,DAY%,YEAR%
  112.     CDATE$=MONTH$(MONTH%)+STR$(DAY%)+","+STR$(YEAR%)
  113.     PRINT
  114.     PRINT "Local sidereal time ( hours [ 0 - 23 ], minutes [ 0 - 59 ], seconds [ 0 - 59 ] )"
  115.     INPUT LST.HR,LST.MIN,LST.SEC
  116.     LST$=STR$(LST.HR)+" hours"+STR$(LST.MIN)+" minutes"+STR$(LST.SEC)+" seconds"
  117.     PRINT
  118.     PRINT "Observer west longitude"
  119.     PRINT "( degrees [ 0 - 359 ], minutes [ 0 - 59 ], seconds [ 0 - 59 ] )"
  120.     INPUT OBSLONG.DEG,OBSLONG.MIN,OBSLONG.SEC
  121.     OBSLONG.RAD=DTR*(OBSLONG.DEG+OBSLONG.MIN/60D0+OBSLONG.SEC/3600D0)
  122.     OBSLONG$=STR$(OBSLONG.DEG)+ " degrees"+STR$(OBSLONG.MIN)+" minutes"+STR$(OBSLONG.SEC)+" seconds"
  123.     PRINT
  124.     PRINT "Time zone ( 0 - 23 )"
  125.     PRINT "( For example, Eastern Standard Time (EST) is time zone 5 )"
  126.     INPUT ZONE%
  127.     PRINT
  128.     PRINT "Daylight Savings Time ( y = yes, n = no )"
  129.     INPUT DST$
  130.     IF INSTR("yY",DST$) THEN
  131.        DST%=1
  132.     ELSE
  133.        DST%=0
  134.     END IF
  135.     JD0=FNJDATE0(MONTH%,DAY%,YEAR%)
  136.     T2=(JD0-2451545D0)/36525D0
  137.     LST=FNDEMOD(1.75336856D0+628.331971D0*T2+6.7707D-06*T2^2)
  138.     T1=XE*(LST.HR+LST.MIN/60D0+LST.SEC/3600D0)
  139.  
  140.     IF ABS(LST-T1)<.001D0 THEN
  141.        T2=(JD0-2451544D0)/36525D0
  142.        LST=FNDEMOD(1.75336856D0+628.331971D0*T2+6.7707D-06*T2^2)
  143.        T1=XE*(LST.HR+LST.MIN/60D0+LST.SEC/3600D0)
  144.     END IF
  145.  
  146.     A=(T1-LST+OBSLONG.RAD)/WE-ZONE%+DST%
  147.     A=A-24D0*INT(A/24D0)
  148.     CALL CONVERT(A,LCT.HR,LCT.MIN,LCT.SEC)
  149.     LCT$=STR$(LCT.HR)+" hours"+STR$(LCT.MIN)+" minutes"+STR$(LCT.SEC)+" seconds"
  150.     JDATE=JD0+(LCT.HR+LCT.MIN/60D0+LCT.SEC/3600D0+ZONE%-DST%)/24D0
  151.  
  152. END SUB
  153.  
  154. '********************************************************************
  155.  
  156. SUB JDATE.FROM.GDATE STATIC
  157.  
  158.     ' Julian date from calendar date subroutine
  159.  
  160.     CLS
  161.     PRINT
  162.     PRINT
  163.     PRINT "Calendar date ( month [ 1 - 12 ], day [ 1 - 31 ], year [ YYYY ] )"
  164.     PRINT "( NOTE: B.C. dates are negative, A.D. dates are positive )"
  165.     PRINT "( For example, October 21, 1948 is input as 10,21,1948 )"
  166.     INPUT MONTH%,DAY%,YEAR%
  167.     CDATE$=MONTH$(MONTH%)+STR$(DAY%)+","+STR$(YEAR%)
  168.     PRINT
  169.     PRINT "Local civil time ( hours [ 0 - 23 ], minutes [ 0 - 59 ] ), seconds [ 0 - 59 ] )"
  170.     PRINT "( For example, 8:30:45 p.M. is input as 20,30,45 )"
  171.     INPUT LCT.HR,LCT.MIN,LCT.SEC
  172.     LCT$=STR$(LCT.HR)+" hours"+STR$(LCT.MIN)+" minutes"+STR$(LCT.SEC)+" seconds"
  173.     PRINT
  174.     PRINT "Time zone ( 0 - 23 )"
  175.     PRINT "( For example, Eastern Standard Time (EST) is time zone 5 )"
  176.     INPUT ZONE%
  177.     PRINT
  178.     PRINT "Daylight Savings Time ( y = yes, n = no )"
  179.     INPUT DST$
  180.     IF INSTR("yY",DST$) THEN
  181.        DST%=1
  182.     ELSE
  183.        DST%=0
  184.     END IF
  185.     JD0=FNJDATE0(MONTH%,DAY%,YEAR%)
  186.     GMT.TIME=FNGMT(LCT.HR,LCT.MIN,LCT.SEC,ZONE%,DST%)
  187.     JDATE=JD0+GMT.TIME/24D0
  188.  
  189. END SUB
  190.  
  191. '********************************************************************
  192.  
  193. SUB LST.FROM.LCT STATIC
  194.  
  195.     ' local sidereal time from local civil time subroutine
  196.  
  197.     CLS
  198.     PRINT
  199.     PRINT
  200.     PRINT "Calendar date ( month [ 1 - 12 ], day [ 1 - 31 ], year [ YYYY ] )"
  201.     PRINT "( NOTE: B.C. dates are negative, A.D. dates are positive )"
  202.     PRINT "( For example, October 21, 1948 is input as 10,21,1948 )"
  203.     INPUT MONTH%,DAY%,YEAR%
  204.     CDATE$=MONTH$(MONTH%)+STR$(DAY%)+","+STR$(YEAR%)
  205.     PRINT
  206.     PRINT "Local civil time ( hours [ 0 - 23 ], minutes [ 0 - 59 ], seconds [ 0 - 59 ] )"
  207.     PRINT "( For example, 8:30:45 p.m. is input as 20,30,45 )"
  208.     INPUT LCT.HR,LCT.MIN,LCT.SEC
  209.     LCT$=STR$(LCT.HR)+" hours"+STR$(LCT.MIN)+" minutes"+STR$(LCT.SEC)+" seconds"
  210.     PRINT
  211.     PRINT "Observer west longitude"
  212.     PRINT "( degrees [ 0 - 359 ], minutes [ 0 - 59 ], seconds [ 0 - 59 ] )"
  213.     INPUT OBSLONG.DEG,OBSLONG.MIN,OBSLONG.SEC
  214.     OBSLONG.RAD=DTR*(OBSLONG.DEG+OBSLONG.MIN/60D0+OBSLONG.SEC/3600D0)
  215.     OBSLONG$=STR$(OBSLONG.DEG)+ " degrees"+STR$(OBSLONG.MIN)+" minutes"+STR$(OBSLONG.SEC)+" seconds"
  216.     PRINT
  217.     PRINT "Time zone ( 0 - 23 )"
  218.     PRINT "( For example, Eastern Standard Time (EST) is time zone 5 )"
  219.     INPUT ZONE%
  220.     PRINT
  221.     PRINT "Daylight Savings Time ( y = yes, n = no )"
  222.     INPUT DST$
  223.     IF INSTR("yY",DST$) THEN
  224.        DST%=1
  225.     ELSE
  226.        DST%=0
  227.     END IF
  228.     JD0=FNJDATE0(MONTH%,DAY%,YEAR%)
  229.     GMT.TIME=FNGMT(LCT.HR,LCT.MIN,LCT.SEC,ZONE%,DST%)
  230.     JDATE=JD0+GMT.TIME/24D0
  231.     T2=(JD0-2451545D0)/36525D0
  232.     LST=FNDEMOD(1.75336856D0+628.331971D0*T2+6.7707D-06*T2^2-OBSLONG.RAD+WE*GMT.TIME)
  233.     CALL CONVERT(LST*XER,LST.HR,LST.MIN,LST.SEC)
  234.     LST$=STR$(LST.HR)+" hours"+STR$(LST.MIN)+" minutes"+STR$(LST.SEC)+" seconds"
  235.  
  236. END SUB
  237.  
  238. '********************************************************************
  239.  
  240. SUB CONVERT(DEG,HR,MIN,SEC) STATIC
  241.  
  242.     ' convert angular time to hms subroutine
  243.  
  244.     HR=INT(DEG)
  245.     C=60D0*(DEG-HR)
  246.     MIN=INT(C)
  247.     SEC=INT(60D0*(C-MIN)+.5D0)
  248.     IF SEC>=60D0 THEN
  249.        MIN=MIN+1D0
  250.        SEC=SEC-60D0
  251.     END IF
  252.     IF MIN>=60D0 THEN
  253.        HR=HR+1D0
  254.        MIN=MIN-60D0
  255.     END IF
  256.     IF HR>=24D0 THEN HR=HR-24D0
  257.  
  258. END SUB
  259.  
  260. '********************************************************************
  261.  
  262. SUB GDATE.FROM.JDATE STATIC
  263.  
  264.     ' Gregorian Date from Julian Date subroutine
  265.  
  266.     DST%=0
  267.     ZONE%=0
  268.  
  269.     CLS
  270.     PRINT
  271.     PRINT
  272.     PRINT "Julian Date"
  273.     INPUT JDATE
  274.     Z=INT(JDATE+.5D0)
  275.     F=JDATE+.5D0-Z
  276.     IF Z<2299161D0 THEN
  277.        A=Z
  278.     ELSE
  279.        A=INT((Z-1867216.25D0)/36524.25D0)
  280.        A=Z+A-INT(A/4)+1D0
  281.     END IF
  282.     B=A+1524D0
  283.     C=INT((B-122.1D0)/365.25D0)
  284.     D=INT(365.25D0*C)
  285.     E=INT((B-D)/30.6001D0)
  286.     DAY%=B-D-INT(30.6001D0*E)
  287.     IF E<13.5D0 THEN
  288.        MONTH%=E-1D0
  289.     ELSE
  290.        MONTH%=E-13D0
  291.     END IF
  292.     IF MONTH%>2.5D0 THEN
  293.        YEAR%=C-4716D0
  294.     ELSE
  295.        YEAR%=C-4715D0
  296.     END IF
  297.  
  298.     CDATE$=MONTH$(MONTH%)+STR$(DAY%)+","+STR$(YEAR%)
  299.  
  300.     CALL CONVERT(24D0*F,LCT.HR,LCT.MIN,LCT.SEC)
  301.     LCT$=STR$(LCT.HR)+" hours"+STR$(LCT.MIN)+" minutes"+STR$(LCT.SEC)+" seconds"
  302.  
  303. END SUB
  304.  
  305. '********************************************************************
  306.  
  307. SUB DISPLAY.DATA STATIC
  308.  
  309.     ' display data subroutine
  310.  
  311.     CLS
  312.     PRINT
  313.     PRINT TAB(30);"Program SIDEREAL"
  314.     PRINT
  315.     PRINT
  316.     PRINT TAB(5);"Calendar date";TAB(62-LEN(CDATE$));CDATE$
  317.     PRINT
  318.     PRINT TAB(5);"Julian Date";
  319.     LOCATE ,47
  320.     PRINT USING "########.####";JDATE
  321.     PRINT
  322.     PRINT TAB(5);"Local civil time";TAB(70-LEN(LCT$));LCT$
  323.  
  324.     IF CHOICE%=3 OR CHOICE%=4 THEN
  325.        PRINT
  326.        PRINT TAB(5);"Local sidereal time";TAB(70-LEN(LST$));LST$
  327.        PRINT
  328.        PRINT TAB(5);"Observer west longitude";TAB(70-LEN(OBSLONG$));OBSLONG$
  329.     END IF
  330.  
  331.     PRINT
  332.     PRINT TAB(5);"Time Zone";TAB(50);ZONE%
  333.     PRINT
  334.  
  335.     IF DST%=1 THEN
  336.        DST$="Yes"
  337.     ELSE
  338.        DST$="No"
  339.     END IF
  340.  
  341.     PRINT TAB(5);"Daylight Savings Time";TAB(51);DST$
  342.     PRINT
  343.     CALL KEYCHECK
  344.  
  345. END SUB
  346.  
  347. '********************************************************************
  348.  
  349. SUB SELECTION.MENU STATIC
  350.  
  351.     ' user selection menu subroutine
  352.  
  353.     CLS
  354.     PRINT
  355.     PRINT
  356.     PRINT TAB(30);"SIDEREAL Menu"
  357.     PRINT
  358.     PRINT
  359.     PRINT TAB(15);"< 1 > Julian Date from calendar date"
  360.     PRINT
  361.     PRINT TAB(15);"< 2 > Calendar date from Julian Date"
  362.     PRINT
  363.     PRINT TAB(15);"< 3 > Local sidereal time from local civil time"
  364.     PRINT
  365.     PRINT TAB(15);"< 4 > Local civil time from local sidereal time"
  366.     PRINT
  367.     PRINT
  368.     PRINT "Selection ( 1, 2, 3 or 4 )"
  369.     INPUT CHOICE%
  370.  
  371. END SUB
  372.  
  373. '********************************************************************
  374.  
  375. SUB INTRODUCTION STATIC
  376.  
  377.     ' program introduction subroutine
  378.  
  379.     CLS
  380.     PRINT
  381.     PRINT TAB(10);"SIDEREAL is an interactive QuickBASIC program which can"
  382.     PRINT TAB(10);"help us learn about time. We can explore the relationship"
  383.     PRINT TAB(10);"between solar or civil time and sidereal time as well as"
  384.     PRINT TAB(10);"the 'Julian Date' and calendar dates."
  385.     PRINT
  386.     PRINT TAB(10);"The Julian Date is the number of days that have passed"
  387.     PRINT TAB(10);"since noon on January 1, 4713 B.C. It is an 'elapsed time'"
  388.     PRINT TAB(10);"benchmark which is used in astronomy to predict the move-"
  389.     PRINT TAB(10);"ment of celestial objects. The Julian Date also has a"
  390.     PRINT TAB(10);"direct relationship with our calendar dates. For example,"
  391.     PRINT TAB(10);"the number of days between two calendar dates is simply"
  392.     PRINT TAB(10);"the difference between their Julian Dates."
  393.     PRINT
  394.     PRINT TAB(10);"The two most widely used calendars are the Julian and"
  395.     PRINT TAB(10);"Gregorian calendars. The Julian calendar was used until"
  396.     PRINT TAB(10);"October 4, 1582 and the Gregorian calendar (due to Pope
  397.     PRINT TAB(10);"Gregory) went into effect on October 15, 1582."
  398.     CALL KEYCHECK
  399.  
  400.     CLS
  401.     PRINT
  402.     PRINT TAB(10);"Solar or civil time is time measured relative to the sun"
  403.     PRINT TAB(10);"while sidereal time is measured with respect to the stars."
  404.     PRINT TAB(10);"Everyone and every star has a sidereal time. The sidereal"
  405.     PRINT TAB(10);"time of a star or planet is called 'right ascension'. When"
  406.     PRINT TAB(10);"your local sidereal time is equal to the right ascension"
  407.     PRINT TAB(10);"of a celestial object, that object is aligned with your"
  408.     PRINT TAB(10);"longitude position on the earth. This event is called a"
  409.     PRINT TAB(10);"'meridian crossing'."
  410.     PRINT
  411.     PRINT TAB(10);"In this program both civil and sidereal time are input and"
  412.     PRINT TAB(10);"output in hours, minutes and seconds. The calendar date is"
  413.     PRINT TAB(10);"also input in numerical format. For example, May 1, 1984"
  414.     PRINT TAB(10);"would be input as '5,1,1984'. Please note that B.C. dates"
  415.     PRINT TAB(10);"are negative and A.D. dates are positive. Also, the first"
  416.     PRINT TAB(10);"B.C. year is 0. When your longitude is requested, you"
  417.     PRINT TAB(10);"should input this in degrees and minutes. This number is"
  418.     PRINT TAB(10);"your west longitude on the earth."
  419.     CALL KEYCHECK
  420.  
  421.     CLS
  422.     PRINT
  423.     PRINT TAB(10);"West longitude equals 360 - east longitude. For example,"
  424.     PRINT TAB(10);"if you were at 85 degrees and 30 seconds east longitude,"
  425.     PRINT TAB(10);"input '274,30' when prompted. Your time zone is an integer"
  426.     PRINT TAB(10);"number between 0 and 23 and depends upon your location on"
  427.     PRINT TAB(10);"the earth. For example, Eastern Standard Time is time zone"
  428.     PRINT TAB(10);"number 5. You should also indicate if Daylight Savings"
  429.     PRINT TAB(10);"Time is in effect at your location."
  430.     CALL KEYCHECK
  431.  
  432. END SUB
  433.  
  434. '********************************************************************
  435.  
  436. SUB KEYCHECK STATIC
  437.  
  438.     ' check user response subroutine
  439.  
  440.     PRINT
  441.     PRINT
  442.     PRINT TAB(25);"< press any key to continue >"
  443.  
  444.     A$=""
  445.     WHILE A$=""
  446.       A$=INKEY$
  447.     WEND
  448.  
  449. END SUB
  450.  
  451.